package com.gewu.pm.ui.activity.home;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.TextView;

import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.gewu.pm.R;
import com.gewu.pm.aop.SingleClick;
import com.gewu.pm.app.AppActivity;
import com.gewu.pm.bean.OrderSummaryBean;
import com.gewu.pm.ui.activity.filter.FilterMultipleActivity;
import com.gewu.pm.ui.adapter.order.OrderSummaryAdapter;
import com.gewu.pm.ui.popup.SelectTimePopup;
import com.gewu.pm.utils.MathUtils;
import com.gewu.pm.widget.FilterBar;
import com.hjq.base.BaseAdapter;
import com.hjq.base.BasePopupWindow;

import java.util.ArrayList;
import java.util.List;

/**
 * 订单汇总报表
 */
public final class ReportOrderSummaryActivity extends AppActivity implements BaseAdapter.OnItemClickListener {

    private FilterBar mFilterBar;
    private RecyclerView mRecyclerView;
    private TextView mTotalQuantityView;
    private TextView mTotalAmountView;

    private OrderSummaryAdapter mAdapter;
    private List<OrderSummaryBean> mDataList = new ArrayList<>();
    private List<OrderSummaryBean> mAllDataList = new ArrayList<>();

    public static void start(Context context) {
        Intent intent = new Intent(context, ReportOrderSummaryActivity.class);
        context.startActivity(intent);
    }

    @Override
    protected int getLayoutId() {
        return R.layout.order_summary_activity;
    }

    @Override
    protected void initView(Bundle savedInstanceState) {
        mFilterBar = findViewById(R.id.filter_bar);
        mRecyclerView = findViewById(R.id.rv_list);
        mTotalQuantityView = findViewById(R.id.tv_total_quantity);
        mTotalAmountView = findViewById(R.id.tv_total_amount);

        // 设置RecyclerView
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAdapter = new OrderSummaryAdapter(this);
        mAdapter.setOnItemClickListener(this);
        mRecyclerView.setAdapter(mAdapter);

        // 设置搜索监听
        mFilterBar.getSearchEditText().addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                searchData(s.toString().trim());
            }
        });

        // 设置日期筛选点击事件
        setOnClickListener(mFilterBar.getDateFilterLayout());
    }

    @Override
    protected void initData() {
        loadData();
    }

    @SingleClick
    @Override
    public void onClick(View view) {
        super.onClick(view);
        if (view == mFilterBar.getDateFilterLayout()) {
            showDateFilterPopup();
        }
    }

    @Override
    public void onRightClick(View view) {
        super.onRightClick(view);
        // 点击筛选按钮
        FilterMultipleActivity.start(getActivity());
    }

    @Override
    public void onItemClick(RecyclerView recyclerView, View itemView, int position) {
        OrderSummaryBean bean = mAdapter.getItem(position);
        toast(bean.getTitle());
    }
    /**
     * 显示日期筛选弹窗
     * 
     * 功能说明：
     * 1. 创建日期选项列表（今日、7天、30天）
     * 2. 显示下拉选择弹窗
     * 3. 选中后更新 FilterBar 显示的日期文本
     */
    private void showDateFilterPopup() {
        // 创建日期选项列表
        List<String> options = new ArrayList<>();
        options.add("今日");
        options.add("7天");
        options.add("30天");

        // 获取当前显示的日期文本（用于设置选中状态）
        String currentText = mFilterBar.getDateFilterTextView().getText().toString();

        // 创建并显示日期选择弹窗
        new SelectTimePopup.Builder(this)
                .setList(options)
                .setSelectedItem(currentText)
                .setListener(new SelectTimePopup.OnListener() {
                    @Override
                    public void onSelected(BasePopupWindow popupWindow, String category) {
                        // 更新 FilterBar 显示的日期文本
                        mFilterBar.setDateFilterText(category);
                        // 显示提示（实际项目中应根据选择的日期重新加载数据）
                        toast(category);
                    }
                })
                .showAsDropDown(mFilterBar.getDateFilterLayout());
    }

    /**
     * 加载数据
     * 
     * 功能说明：
     * 1. 清空原有数据
     * 2. 创建测试数据（实际项目中应从服务器获取）
     * 3. 更新列表显示
     * 4. 计算并更新底部合计
     */
    private void loadData() {
        // 清空数据列表
        mAllDataList.clear();
        mDataList.clear();

        // 创建测试数据（实际项目中应从服务器获取）
        // 参数：id, 商品名称, 发货金额, 发货数量
        OrderSummaryBean bean1 = new OrderSummaryBean("1", "魔芋结230g*20", 273.00, 105);
        OrderSummaryBean bean2 = new OrderSummaryBean("2", "小浣熊230g*20", 273.00, 105);
        OrderSummaryBean bean3 = new OrderSummaryBean("3", "六个核桃230g*20", 273.00, 105);
        OrderSummaryBean bean4 = new OrderSummaryBean("4", "道口烧鸡230g*20", 273.00, 105);

        // 添加到全部数据列表（用于搜索时恢复）
        mAllDataList.add(bean1);
        mAllDataList.add(bean2);
        mAllDataList.add(bean3);
        mAllDataList.add(bean4);

        // 复制到当前显示列表
        mDataList.addAll(mAllDataList);
        
        // 更新适配器数据
        mAdapter.setData(mDataList);

        // 计算并更新底部合计
        updateTotal();
    }

    /**
     * 搜索数据
     * 
     * 功能说明：
     * 1. 根据关键词筛选商品名称
     * 2. 更新列表显示
     * 3. 重新计算底部合计（只统计搜索结果）
     * 
     * @param keyword 搜索关键词
     */
    private void searchData(String keyword) {
        // 清空当前显示列表
        mDataList.clear();

        if (keyword.isEmpty()) {
            // 关键词为空，显示全部数据
            mDataList.addAll(mAllDataList);
        } else {
            // 根据关键词筛选数据（模糊匹配商品名称）
            for (OrderSummaryBean bean : mAllDataList) {
                if (bean.getTitle().contains(keyword)) {
                    mDataList.add(bean);
                }
            }
        }

        // 更新适配器数据
        mAdapter.setData(mDataList);
        
        // 重新计算底部合计（只统计搜索结果的数据）
        updateTotal();
    }

    /**
     * 更新底部合计
     * 
     * 功能说明：
     * 1. 遍历当前显示的列表数据
     * 2. 累加发货数量（整数相加）
     * 3. 累加发货金额（使用 MathUtils.moneyAdd 确保金额精度）
     * 4. 更新底部合计显示
     */
    private void updateTotal() {
        // 初始化合计变量
        int totalQuantity = 0;      // 发货数量总和
        double totalAmount = 0.0;   // 发货金额总和

        // 遍历当前显示的列表数据，累加数量和金额
        for (OrderSummaryBean bean : mDataList) {
            // 累加发货数量（整数直接相加）
            totalQuantity += bean.getDeliveryQuantity();
            
            // 累加发货金额（使用 MathUtils.moneyAdd 确保金额精度，避免浮点数精度问题）
            // 例如：避免 0.1 + 0.2 = 0.30000000000000004 这类问题
            totalAmount = MathUtils.moneyAdd(totalAmount, bean.getPrice());
        }

        // 更新底部合计显示
        mTotalQuantityView.setText(String.valueOf(totalQuantity));
        
        // 格式化金额显示（保留2位小数）
        mTotalAmountView.setText(String.format("%.2f", totalAmount));
    }

}
